//The MIT License
//
//Copyright (c) <2011> <GEPAR - Grupo de Ensino e Pesquisa em Agroinformática e Rastreabilidade>
//
//Permission is hereby granted, free of charge, to any person obtaining a copy
//of this software and associated documentation files (the "Software"), to deal
//in the Software without restriction, including without limitation the rights
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//copies of the Software, and to permit persons to whom the Software is
//furnished to do so, subject to the following conditions:
//
//The above copyright notice and this permission notice shall be included in
//all copies or substantial portions of the Software.
//
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
//THE SOFTWARE.

package com;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.annotation.Resource;
import java.sql.*;
import javax.sql.DataSource;
import javax.sql.rowset.CachedRowSet;
import com.sun.rowset.CachedRowSetImpl;
import com.br.util.FonteConexoes;

@ManagedBean(name="visualizarTabulacao")
@ViewScoped
public class VisualizarTabulacaoBean
{
    private int idTabulacao;

    // DADOS BÁSICOS DA TABULAÇÃO

    private String dataCol;

    private String nomeRespCol;

    private String nomeRespCol2;

    private String nomeProduto;

    private String nomeEntreposto;

    private String nomeClassific;

    private String infoCaixa;

    private String dataTabul;

    private String nomeRespTabul;

    // FIM DOS DADOS BÁSICOS DA TABULAÇÃO

    // PREÇOS DA TABULAÇÃO
    CachedRowSet cachedPrecos;

    // DADOS ESTATÍSTICOS

    private String precoMaxC;

    private String precoMaxU;

    private String precoMinC;

    private String precoMinU;

    private String mediaCaixa;

    private String mediaUnidade;

    private String modaCaixa;

    private String modaUnidade;

    /**
     * Constante que indica distribuição amodal
     */
    private final String amodal = "-1,00" ;

    private String medianaCaixa;

    private String medianaUnidade;

    // FIM DOS DADOS ESTATÍSTICOS

    // ACESSO AO BANCO DE DADOS. FUTURAMENTE, RETIRAR DESSA CLASSE.
    //@Resource(name="jdbc/hermesweb") private DataSource dataSource;

    public int getIdTabulacao()
    {
        return idTabulacao;
    }

    public String getDataCol()
    {
        return dataCol;
    }

    public String getDataTabul()
    {
        return dataTabul;
    }

    public String getNomeClassific()
    {
        return nomeClassific;
    }

    public String getNomeEntreposto()
    {
        return nomeEntreposto;
    }

    public String getNomeProduto()
    {
        return nomeProduto;
    }

    public String getNomeRespCol()
    {
        return nomeRespCol;
    }

    public String getNomeRespCol2()
    {
        return nomeRespCol2;
    }

    public String getNomeRespTabul()
    {
        return nomeRespTabul;
    }

    public String getInfoCaixa()
    {
        return infoCaixa;
    }

    public ResultSet getCachedPrecos()
    {
        return cachedPrecos;
    }

    public String getMediaCaixa()
    {
        return mediaCaixa;
    }

    public String getMediaUnidade()
    {
        return mediaUnidade;
    }

    public String getMedianaCaixa()
    {
        return medianaCaixa;
    }

    public String getMedianaUnidade()
    {
        return medianaUnidade;
    }

    public String getModaCaixa()
    {
        return modaCaixa;
    }

    public String getModaUnidade()
    {
        return modaUnidade;
    }

    public String getPrecoMaxC()
    {
        return precoMaxC;
    }

    public String getPrecoMaxU()
    {
        return precoMaxU;
    }

    public String getPrecoMinC()
    {
        return precoMinC;
    }

    public String getPrecoMinU()
    {
        return precoMinU;
    }

    public void setIdTabulacao(int idTabulacao)
    {
        this.idTabulacao = idTabulacao;
    }

    // ACESSO AO BANCO DE DADOS. FUTURAMENTE, RETIRAR DESSA CLASSE.

    public String getVisualizarTabulacao() throws Exception
    {
        // chamada dos métodos que obtêm todas as informações desta tabulação
        basico();
        precos();
        estatisticas();

        return "Visualização da tabulação " + dataCol + " - " + nomeProduto;
    }

    public void basico() throws Exception
    {
        Connection conexao = null;
        conexao = new FonteConexoes().getConnection();
        
        try
        {
            PreparedStatement sentenca =
                    conexao.prepareStatement(
                                             "SELECT " +
                                             "DATE_FORMAT(tabul.datac_tabu, '%d/%m/%Y') AS data_col, " + 
                                             "respcol.nome_respc AS nome_resp_col, " +
                                             "respcol2.nome_respc AS nome_resp_col2, " +
                                             "prod.nome_prod AS nome_produto, " +
                                             "entrep.nome_entr AS nome_entreposto, " +
                                             "classific.nome_clas AS nome_classific, " +
                                             "tipocaixa.nome_tipoc AS tipo_caixa, " +
                                             "qtdecaixa.qtde_qtdec AS qtde_caixa, " +
                                             "DATE_FORMAT(tabul.datat_tabu, '%d/%m/%Y') AS data_tabul, " +
                                             "usuarios.nome_completo_usua AS nome_resp_tabul " +
                                             "FROM " +
                                             "tabulacoes tabul " +
                                             "LEFT JOIN responsaveis_col respcol ON tabul.id_respc = respcol.id_respc " +
                                             "LEFT JOIN responsaveis_col respcol2 ON tabul.id_respc2 = respcol2.id_respc " +
                                             "LEFT JOIN produtos prod ON tabul.id_prod = prod.id_prod " +
                                             "LEFT JOIN entrepostos entrep ON tabul.id_entr = entrep.id_entr " +
                                             "LEFT JOIN classificacoes classific ON tabul.id_clas = classific.id_clas " +
                                             "LEFT JOIN tipos_caixa tipocaixa ON tabul.id_tipoc = tipocaixa.id_tipoc " +
                                             "LEFT JOIN qtdes_caixa qtdecaixa ON tabul.id_qtdec = qtdecaixa.id_qtdec " +
                                             "LEFT JOIN usuarios ON tabul.id_respt = usuarios.id_usua " +
                                             "WHERE " +
                                             "tabul.id_tabu = ?"
                                            );
            
            sentenca.setInt(1, idTabulacao);

            ResultSet rs = sentenca.executeQuery();

            if (rs.next())
            {
                // populando os campos com as informações básicas recuperadas do banco de dados
                dataCol = rs.getString("data_col");
                nomeRespCol = rs.getString("nome_resp_col");
                nomeRespCol2 = rs.getString("nome_resp_col2");
                nomeProduto = rs.getString("nome_produto");
                nomeEntreposto = rs.getString("nome_entreposto");
                nomeClassific = rs.getString("nome_classific");
                infoCaixa =  rs.getInt("qtde_caixa")  + " " + rs.getString("tipo_caixa");
                dataTabul = rs.getString("data_tabul");
                nomeRespTabul = rs.getString("nome_resp_tabul");
            }
        }
        finally
        {
            conexao.close();
        }
    }

    public void precos() throws Exception
    {
        Connection conexao = null;
        conexao = new FonteConexoes().getConnection();

        try
        {
            PreparedStatement sentenca =
                    conexao.prepareStatement(
                                             "SELECT " +
                                             "REPLACE(FORMAT(precos.valor_caixa_prec, 2), '.', ',') AS valor_caixa, " + 
                                             "REPLACE(FORMAT(precos.valor_unidade_prec, 2), '.', ',') AS valor_unidade " +
                                             "FROM " +
                                             "precos " +
                                             "WHERE " +
                                             "precos.id_tabu = ?"
                                            );
            
            sentenca.setInt(1, idTabulacao);

            ResultSet rs = sentenca.executeQuery();
            cachedPrecos = new CachedRowSetImpl();
            cachedPrecos.populate(rs);
        }
        finally
        {
            conexao.close();
        }
    }

    public void estatisticas() throws Exception
    {
        Connection conexao = null;
        conexao = new FonteConexoes().getConnection();

        try
        {
            PreparedStatement sentenca =
                    conexao.prepareStatement(
                                             "SELECT " +
                                             "REPLACE(FORMAT(estatisticas.preco_max_c_esta, 2), '.', ',') AS preco_max_c, " + 
                                             "REPLACE(FORMAT(estatisticas.preco_max_u_esta, 2), '.', ',') AS preco_max_u, " +
                                             "REPLACE(FORMAT(estatisticas.preco_min_c_esta, 2), '.', ',') AS preco_min_c, " +
                                             "REPLACE(FORMAT(estatisticas.preco_min_u_esta, 2), '.', ',') AS preco_min_u, " +
                                             "REPLACE(FORMAT(estatisticas.media_caixa_esta, 2), '.', ',') AS media_caixa, " +
                                             "REPLACE(FORMAT(estatisticas.media_unidade_esta, 2), '.', ',') AS media_unidade, " +
                                             "REPLACE(FORMAT(estatisticas.moda_caixa_esta, 2), '.', ',') AS moda_caixa, " +
                                             "REPLACE(FORMAT(estatisticas.moda_unidade_esta, 2), '.', ',') AS moda_unidade, " +
                                             "REPLACE(FORMAT(estatisticas.mediana_caixa_esta, 2), '.', ',') AS mediana_caixa, " +
                                             "REPLACE(FORMAT(estatisticas.mediana_unidade_esta, 2), '.', ',') AS mediana_unidade " +
                                             "FROM " +
                                             "estatisticas " +
                                             "WHERE " +
                                             "estatisticas.id_tabu = ?"
                                            );
            sentenca.setInt(1, idTabulacao);

            ResultSet rs = sentenca.executeQuery();

            if (rs.next())
            {
                // populando os campos com as informações básicas recuperadas do banco de dados
                precoMaxC = rs.getString("preco_max_c");
                precoMaxU = rs.getString("preco_max_u");
                precoMinC = rs.getString("preco_min_c");
                precoMinU = rs.getString("preco_min_u");
                mediaCaixa = rs.getString("media_caixa");
                mediaUnidade = rs.getString("media_unidade");

                modaCaixa = rs.getString("moda_caixa");

                if (modaCaixa.equals(amodal))
                {
                    // a distribuição atual é amodal
                    modaCaixa = "amodal";
                    modaUnidade = "amodal";
                }
                else
                {
                    // a distribuição atual tem moda
                    modaUnidade = rs.getString("moda_unidade");
                }

                medianaCaixa = rs.getString("mediana_caixa");
                medianaUnidade = rs.getString("mediana_unidade");
            }
        }
        finally
        {
            conexao.close();
        }
    }
}
